package com.tan.api.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * @author Tan
 * @description
 * @date 2025/2/7
 */

@Configuration
public class JacksonConfig {

    /**
     * 配置并返回一个定制的 ObjectMapper 实例，
     * 注册自定义的 LocalDateTime 序列化器和反序列化器。
     */
    @Bean
    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
        ObjectMapper objectMapper = new ObjectMapper();
        // 禁用默认的时间戳（毫秒数）格式，以确保日期时间被序列化为字符串形式
        objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
        ObjectMapper mapper = new ObjectMapper();
        // 创建一个新的模块，并添加自定义的序列化器和反序列化器
        SimpleModule module = new SimpleModule();
        // 注册自定义的 Long 序列化器
        module.addSerializer(Long.class, ToStringSerializer.instance);
        module.addSerializer(long.class, ToStringSerializer.instance);
        // 处理 Double 和 double 类型
        module.addSerializer(Double.class, ToStringSerializer.instance);
        module.addSerializer(double.class, ToStringSerializer.instance);
        // 处理 BigDecimal 类型
        module.addSerializer(BigDecimal.class, ToStringSerializer.instance);
        module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
        module.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
        // 注册模块到 ObjectMapper 中
        mapper.registerModule(module);
        return new MappingJackson2HttpMessageConverter(mapper);
    }
}
